package 打印流;

import java.io.*;
import java.util.Date;

public class PrintStreamDetailedDemo {

    public static void main(String[] args) {
        // 1. 基本PrintStream使用
//        basicPrintStreamUsage();

//        // 2. 基本PrintWriter使用
//        basicPrintWriterUsage();
//
//        // 3. 格式化输出示例
//        formattedOutput();
//
//        // 4. 重定向系统输出
        redirectSystemOutput();
//
//        // 5. 异常处理示例
//        exceptionHandling();
    }

    // 基本PrintStream使用
    private static void basicPrintStreamUsage() {
        try (PrintStream ps = new PrintStream("printstream_output.txt")) {
            ps.println("=== PrintStream基本使用 ===");
            ps.print("整数: ");
            ps.println(100);
            ps.print("浮点数: ");
            ps.println(3.14159);
            ps.print("布尔值: ");
            ps.println(true);
            ps.print("字符: ");
            ps.println('A');
            ps.print("对象: ");
            ps.println(new Date());
        } catch (FileNotFoundException e) {
            System.err.println("文件未找到: " + e.getMessage());
        }
    }

    // 基本PrintWriter使用
    private static void basicPrintWriterUsage() {
        try (PrintWriter pw = new PrintWriter("printwriter_output.txt")) {
            pw.println("=== PrintWriter基本使用 ===");
            pw.print("整数: ");
            pw.println(200);
            pw.print("浮点数: ");
            pw.println(2.71828);
            pw.print("布尔值: ");
            pw.println(false);
            pw.print("字符: ");
            pw.println('B');
            pw.print("对象: ");
            pw.println(new Date());
        } catch (FileNotFoundException e) {
            System.err.println("文件未找到: " + e.getMessage());
        }
    }

    // 格式化输出示例
    private static void formattedOutput() {
        try (PrintWriter pw = new PrintWriter("formatted_output.txt")) {
            pw.println("=== 格式化输出示例 ===");

            // 使用printf进行格式化输出
            pw.printf("整数: %d, 十六进制: %x, 八进制: %o%n", 255, 255, 255);
            pw.printf("浮点数: %.2f, 科学计数法: %.2e%n", 3.14159, 314159.0);
            pw.printf("字符串: %s, 字符: %c%n", "Hello", 'A');
            pw.printf("布尔值: %b%n", true);
            pw.printf("当前时间: %tT, 日期: %tF%n", new Date(), new Date());
            pw.printf("宽度和对齐: |%10d|, |%-10d|%n", 123, 123);
            pw.printf("前导零: %05d%n", 42);

            // 使用format方法(与printf相同)
            pw.format("格式化的金额: $%,.2f%n", 1234567.89);
        } catch (FileNotFoundException e) {
            System.err.println("文件未找到: " + e.getMessage());
        }
    }

    // 重定向系统输出
    private static void redirectSystemOutput() {
        // 保存原始System.out
        PrintStream originalOut = System.out;

        // 重定向到文件
//            PrintStream fileOut = new PrintStream("system_output.txt");
//            System.setOut(fileOut);

        System.out.println("=== 系统输出重定向示例 ===");
        System.out.println("这行文字将输出到文件而不是控制台");
        System.out.printf("当前时间: %tT%n", new Date());

        // 执行一些计算并输出
        for (int i = 1; i <= 5; i++) {
            System.out.printf("%d的平方: %d%n", i, i * i);
        }

        // 恢复原始System.out
        System.setOut(originalOut);
//            fileOut.close();

        System.out.println("系统输出已恢复，这行文字显示在控制台");
    }

    // 异常处理示例
    private static void exceptionHandling() {
        try (PrintStream ps = new PrintStream("exception_test.txt")) {
            // 正常输出
            ps.println("正常输出测试");

            // 模拟错误 - 关闭底层流后尝试输出
            ps.close();
            ps.println("这行不会输出，因为流已关闭");

        } catch (FileNotFoundException e) {
            System.err.println("文件未找到: " + e.getMessage());
        }

        // 使用checkError检查错误状态
        PrintStream ps = new PrintStream(new OutputStream() {
            @Override
            public void write(int b) throws IOException {
                throw new IOException("模拟写入错误");
            }
        });

        ps.print("测试错误");
        if (ps.checkError()) {
            System.out.println("检测到打印流错误");
        }
        ps.close();
    }
}